/*
 * receptor.cpp
 *
 *  Created on: Dec 13, 2013
 *      Author: m
 */

#include "MessageQueue.h"
#include "ColaRemotaComun.h"
#include "CPrinter.h"
#include "StringUtils.h"
#include "ArchivoIni.h"
#include "RoutingTable.h"

using ipc::MessageQueue;
using ipc::CPrinter;

int main ( int argc, char* argv[] )
{
    int socket;
    int ack = 0;
    int currentBrokerId;

    MessageQueue<PaqueteColaRemota> colaMensajes =
            MessageQueue<PaqueteColaRemota>::get( IPC_BASEFILE, COLA_MENSAJES_BROKER );

    CPrinter::setHeader("receptor");

    if (argc != 2)
    {
        CPrinter::printErr( "Error: Cantidad de argumentos invalida" );
        exit(1);
    }

    // Parsear el socket! (viene por argumento)
    sscanf( argv[1], "%d", &socket );

    {
        ArchivoIni configFile( CR_CONFIG_FILE );
        currentBrokerId = StringUtils::StringToNumber<int>( configFile.getValue( "brokerId" ) );
    }

    CPrinter::printOut( "Creado un receptor de cola remota en el socket: %d", socket );

    while ( true )
    {
        PaqueteColaRemota msg;
        int brokerId;

        // Recibo un paquete por el socket
        if ( recibir( socket, &msg, sizeof( PaqueteColaRemota ) ) > 0 )
        {

        	CPrinter::printOut( "Recibi un mensaje de para la cola: %d", msg.destino );

        	// Verifico si el destino es local
        	brokerId = RoutingTable::getRoute( msg.destino );

        	if ( brokerId == 0 || brokerId == currentBrokerId )
        	{
                // Lo deposito en la cola de mensajes con mtype destino
                colaMensajes.put( msg.destino, msg );
        	}
        	else
        	{
        	    // Le pongo el mtype del broker al que debe forwardearse el mensaje
                colaMensajes.put( brokerId, msg );
        	}

            enviar( socket, &ack, sizeof( int ) );
        }
        else
        {
	        CPrinter::printErr( "Error: El otro extremo se cerro!" );
        	exit(1);
        }
    }

    return 0;
}
